#include "app_message.h"

/**
 * @brief 将字符数组转换为JSON字符串
 * @param chars     字符数组     [124XXabcd]
 * @param chars_len 字符数组长度  9
 * @return char *   字符串       {"conn_type":1,"id":"5858","msg":"61626364"}
 */
char *app_message_CharsToJsonStr(char *chars, int chars_len)
{
    // 1.取出数组中的每个部分:连接类型、ID长度、消息长度、ID、消息
    int conn_type = chars[0];
    int id_len = chars[1];
    int msg_len = chars[2];

    // 1.1 定义ID数组用于接收ID数据
    char id_buff[id_len];
    memcpy(id_buff, chars + 3, id_len);

    // 1.2 定义msg数组用于接收msg数据
    char msg_buff[msg_len];
    memcpy(msg_buff, chars + 3 + id_len, msg_len);
    log_info("msg_buffer = %s,msg_len = %d", msg_buff, msg_len);

    // 2.将ID、消息转换为十六进制字符数组
    char *id_hex_buff = app_common_charsToHexStr(id_buff, id_len);
    char *msg_hex_buff = app_common_charsToHexStr(msg_buff, msg_len);

    // 3.封装JSON对象
    cJSON *json = cJSON_CreateObject();
    cJSON_AddNumberToObject(json, "conn_type", conn_type);
    cJSON_AddStringToObject(json, "id", id_hex_buff);
    cJSON_AddStringToObject(json, "msg", msg_hex_buff);

    // 4.将JSON对象转换为字符串
    char *json_str = cJSON_PrintUnformatted(json);

    // 5.释放资源
    cJSON_Delete(json);
    free(id_hex_buff);
    free(msg_hex_buff);

    // 6.返回结果
    return json_str;
}

/**
 * @brief 将JSON字符串转换为字符数组
 * @param json_str          要转换的JSON字符串    {"conn_type":1,"id":"5858","msg":"61626364"}
 * @param chars_buff        存放转换后的数据容器
 * @param chars_buff_len     容器大小
 * @return int               转换后字符数组中数据的长度  [124XXabcd]
 */
int app_message_JsonStrToChars(char *json_str, char *chars_buff, int chars_buff_len)
{
    // 1.解析JSON数据,取出JSON数据中的三个值:连接类型、ID、MSG
    cJSON *json = cJSON_Parse(json_str);
    if (json == NULL)
    {
        log_error("JSON解析失败!");
        return -1;
    }
    int conn_type = cJSON_GetObjectItem(json, "conn_type")->valueint;
    char *id_hex_str = cJSON_GetObjectItem(json, "id")->valuestring;
    char *msg_hex_str = cJSON_GetObjectItem(json, "msg")->valuestring;

    int id_len = strlen(id_hex_str) / 2;
    int msg_len = strlen(msg_hex_str) / 2;

    int data_len = 3 + id_len + msg_len;
    if (data_len > chars_buff_len)
    {
        log_error("容器大小不足!!!");
        return -1;
    }

    // 2.将十六进制数据转换为字符数据
    char *id_str = app_common_HexStrToChar(id_hex_str, sizeof(id_hex_str));
    char *msg_str = app_common_HexStrToChar(msg_hex_str, sizeof(msg_hex_str));

    // 3.将数据全部拷贝到容器中 [124XXabcd]
    chars_buff[0] = conn_type;
    chars_buff[1] = id_len;
    chars_buff[2] = msg_len;
    memcpy(chars_buff + 3, id_str, id_len);
    memcpy(chars_buff + 3 + id_len, msg_str, msg_len);

    // 4.释放资源
    cJSON_Delete(json);
    free(id_str);
    free(msg_str);

    // 4.返回数据长度
    return data_len;
}
